package com.yht.weblog.admin.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yht.weblog.admin.model.vo.tag.*;
import com.yht.weblog.admin.service.AdminTagService;
import com.yht.weblog.common.domain.dos.ArticleTagRelDO;
import com.yht.weblog.common.domain.dos.TagDO;
import com.yht.weblog.common.domain.mapper.ArticleTagRelMapper;
import com.yht.weblog.common.domain.mapper.TagMapper;
import com.yht.weblog.common.enums.ResponseCodeEnum;
import com.yht.weblog.common.exception.BizException;
import com.yht.weblog.common.model.vo.SelectRspVO;
import com.yht.weblog.common.utils.PageResponse;
import com.yht.weblog.common.utils.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author: yht
 * @date: 2024/1/1 11:10
 * @description:
 **/
@Service
@Slf4j
public class AdminTagServiceImpl extends ServiceImpl<TagMapper, TagDO> implements AdminTagService {

    @Autowired
    private TagMapper tagMapper;

    @Autowired
    private ArticleTagRelMapper articleTagRelMapper;

    /**
     * 添加标签
     *
     * @param addTagReqVO 添加标签请求对象
     * @return 响应对象
     */
    @Override
    public Response addTags(AddTagReqVO addTagReqVO) {
        // 将传入的标签列表转换为TagDO对象集合
        List<TagDO> tagDOS = addTagReqVO.getTags()
                .stream()
                .map(tagName -> TagDO.builder().name(tagName.trim())
                        .createTime(LocalDateTime.now())
                        .updateTime(LocalDateTime.now())
                        .build())
                .collect(Collectors.toList());

        try {
            // 批量保存TagDO对象
            saveBatch(tagDOS);
        } catch (Exception e) {
            log.warn("该标签已存在，e");
            return Response.fail(ResponseCodeEnum.TAG_CANT_DUPLICATE);
        }

        return Response.success();
    }

    /**
     * 查询标签列表数据
     *
     * @param findTagPageListReqVO 查询标签列表数据请求对象
     * @return 响应对象
     */
    @Override
    public PageResponse findTagPageList(FindTagPageListReqVO findTagPageListReqVO) {
        // 调用mapper方法查询标签列表数据
        Page<TagDO> tagDOPage = tagMapper.selectPageList(findTagPageListReqVO.getCurrent(), findTagPageListReqVO.getSize(), findTagPageListReqVO.getName(), findTagPageListReqVO.getStartDate(), findTagPageListReqVO.getEndDate());
        // 获取查询结果中的标签数据
        List<TagDO> tagDOS = tagDOPage.getRecords();

        List<FindTagPageListRspVO> vos = null;

        // 如果查询结果中有标签数据
        if (!CollectionUtils.isEmpty(tagDOS)) {
            // 使用流式操作生成FindTagPageListRspVO对象列表
            vos = tagDOS.stream()
                    .map(tagDO -> FindTagPageListRspVO.builder()
                            .id(tagDO.getId())
                            .name(tagDO.getName())
                            .createTime(tagDO.getCreateTime())
                            .build())
                    .collect(Collectors.toList());
        }

        // 返回响应对象，包括查询结果的分页信息和标签数据列表
        return PageResponse.success(tagDOPage, vos);
    }

    /**
     * 删除标签
     *
     * @param deleteTagReqVO 删除标签请求对象
     * @return 响应对象
     */
    @Override
    public Response deleteTag(DeleteTagReqVO deleteTagReqVO) {
        Long id = deleteTagReqVO.getId();

        ArticleTagRelDO articleTagRelDO = articleTagRelMapper.selectOneByTagId(id);

        if(Objects.nonNull(articleTagRelDO)){
            log.warn("==> 该标签下存在文章，无法删除，tagId:{}", id);
            throw new BizException(ResponseCodeEnum.TAG_CAN_NOT_DELETE);
        }

        // 根据标签 ID 删除标签
        int count = tagMapper.deleteById(id);

        return count == 1 ? Response.success() : Response.fail(ResponseCodeEnum.TAG_NOT_EXISTED);
    }

    /**
     * 标签模糊查询
     *
     * @param searchTagReqVO 标签模糊查询请求对象
     * @return 响应对象
     */
    @Override
    public Response searchTag(SearchTagReqVO searchTagReqVO) {
        // 根据关键词查询标签
        List<TagDO> tagDOS = tagMapper.selectByKey(searchTagReqVO.getKey());

        List<SelectRspVO> vos = null;

        // 如果存在查询结果
        if (!CollectionUtils.isEmpty(tagDOS)) {
            // 将查询结果转换为SelectRspVO对象列表
            vos = tagDOS.stream().map(tagDO -> SelectRspVO.builder()
                    .value(tagDO.getId())
                    .label(tagDO.getName())
                    .build()).collect(Collectors.toList());
        }

        // 返回查询结果
        return Response.success(vos);
    }

    /**
     * 查询标签下拉列表数据
     *
     * @return 响应对象
     */
    @Override
    public Response findTagSelectList() {
        // 查询所有标签, Wrappers.emptyWrapper()表示查询所有
        List<TagDO> tagDOS = tagMapper.selectList(Wrappers.emptyWrapper());

        List<SelectRspVO> vos = null;
        if (!CollectionUtils.isEmpty(tagDOS)) {
            vos = tagDOS.stream().map(tagDO -> SelectRspVO.builder()
                    .value(tagDO.getId())
                    .label(tagDO.getName())
                    .build()).collect(Collectors.toList());
        }
        return Response.success(vos);
    }

}
